package com.atguigu.java.ai.langchain4j.config;

import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.loader.ClassPathDocumentLoader;
import dev.langchain4j.data.document.parser.TextDocumentParser;
import dev.langchain4j.data.document.splitter.DocumentByParagraphSplitter;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.embedding.onnx.HuggingFaceTokenizer;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.IngestionResult;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import dev.langchain4j.store.embedding.pinecone.PineconeEmbeddingStore;
import dev.langchain4j.store.embedding.pinecone.PineconeServerlessIndexConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class EmbeddingStoreConfig {

    @Autowired
    private EmbeddingModel embeddingModel;

    /**
     * @author: Simple
     * @date: 2025-09-04 19:50:24
     * @description: 配置向量存储对象 apikey链接pinecone数据库
     */
    @Bean
    public EmbeddingStore<TextSegment> embeddingStore() {
        return PineconeEmbeddingStore.builder()
                .apiKey("pcsk_2XhjpD_Be3z1fCAv4nBYkB1NtxRxXuthN7qfS2ES5hpg68CFuFPQDJWZh4qJaY4v5p1mtv")
                .index("xiaozhi-index")//若不存在 自动创建
                .nameSpace("xiaozhi-namespace")//如果指定的名称空间不存在，将创建一个新的名称空间
                .createIndex(PineconeServerlessIndexConfig.builder()
                        .cloud("AWS")//指定索引部署在 AWS 云服务上。
                        .region("us-east-1")//指定索引所在的 AWS 区域为 us-east-1。
                        .dimension(embeddingModel.dimension())//指定索引的向量维度，该维度与 embeddedModel 生成的向量维度相同。
                        .build())
                .build();
    }

    public EmbeddingStore<TextSegment> repeatStoreConfig(){
        return PineconeEmbeddingStore.builder()
                .apiKey("pcsk_2XhjpD_Be3z1fCAv4nBYkB1NtxRxXuthN7qfS2ES5hpg68CFuFPQDJWZh4qJaY4v5p1mtv")
                .index("demo-index")
                .nameSpace("deme-namespace")
                .createIndex(PineconeServerlessIndexConfig.builder()
                        .cloud("AWS")
                        .region("us-east-1")
                        .dimension(embeddingModel.dimension())
                        .build())
                .build();
    }
    /**
     * @author: Simple
     * @date: 2025-09-04 20:49:56
     * @description: 配置向内存中添加向量库 添加内容
     */
//    @Bean
//    public ContentRetriever embeddingStoreInMemory(){
//        //首先读出来 txt使用默认的文档解析器即可
//        Document document = ClassPathDocumentLoader.loadDocument("knowledge/医院的来历.txt", new TextDocumentParser());
//        //创建一个内存的 嵌入式向量数据库
//        InMemoryEmbeddingStore<TextSegment> store = new InMemoryEmbeddingStore<>();
//        //搞一个分割器分割一下文档
//        DocumentByParagraphSplitter paragraphSplitter = new DocumentByParagraphSplitter(300,
//                30, new HuggingFaceTokenizer());
//        //把数据进去
//        IngestionResult ingestionResult = EmbeddingStoreIngestor.builder()
//                .embeddingStore(store)
//                .documentSplitter(paragraphSplitter)
//                .build()
//                .ingest(document);
//        return EmbeddingStoreContentRetriever.from(store);
//    }

}